package kr.co.bettersoft.waitnumberstoret.activity;


import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import kr.co.bettersoft.waitnumberstoret.common.CommonConstant;
import kr.co.bettersoft.waitnumberstoret.common.WaitnumberStoreMRest;
import kr.co.bettersoft.waitnumberstoret.domain.EventNotice;

import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
 * MainNoticeDetailActivity
 * 
 * 공지 상세화면.
 * 
 * 메인 - 공지 리스트에서 특정 공지사항을 선택하여 공지 상세 화면으로 이동된다.
 * 
 * 공지 상세 화면에서는  공지에 대한 상세 정보를 확인할 수 있다.
 */
public class MainNoticeDetailActivity extends Activity {
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// 변수
	
	String TAG = "MainNoticeDetailActivity";
	
	public final int GET_NOTICE_DETAIL = 501;				// 이벤트 상세 정보를 가져온다.
	
	String eventImgDomain = CommonConstant.eventImgDomain;
	Bitmap img ;
	
	// 폰트
	private Typeface typefaceNanumGothic= null; 
	private Typeface typefaceNanumGothicBold = null;
	
	// 설정 파일 저장소	
	SharedPreferences sharedPrefCustom;
	
	// 서버 통신
	WaitnumberStoreMRest waitnumberStoreMRest;
	String callResult = "";
//	String tempstr = "";
	JSONObject jsonObject;
	
	// 서버로부터 받은 정보.
	EventNotice eventNoticeFromServer;
	EventNotice eventNoticeFromIntent;
	
	// 전달받은 정보
	String idWaitingEvents = "";
	String merchantId = "";
	String companyName = "";
	String subject = "";
	String content = "";
	String imageFileUrl = "";
	String registerDate = "";
	
	// 결과 정보
	String noticeTitle = "";
	String noticeContent = "";
	String noticeRegisterDate = "";
	
	// 화면 구성
	TextView noticeDetailTitle;	
	ImageView noticeDetailImageView;	
	
	TextView noticeDetailContent;
	
	TextView storeNameView ;	
	TextView regDateView ;	
	
	Button topNaviCloseBtn; 		// 상단 닫기 버튼
//	Button closeBtn;	// 하단 확인 버튼
	
	ProgressBar pb1;		// 중단 로딩 진행바

	
////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		// 받아온결과를 화면에 뿌려준다.
				if(b.getInt("showYN")==1){

					hidePb();
	
					if(eventNoticeFromServer.getImageFileUrl()!=null&&eventNoticeFromServer.getImageFileUrl().length()>0){
						noticeDetailImageView.setImageBitmap(eventNoticeFromServer.getImageFile());
					}else{
						noticeDetailImageView.setVisibility(View.GONE);
//						noticeDetailImageView.setVisibility(View.GONE);	// 치움-> 하단 버튼 찌그러지므로 치우지 않음. 
					}
					Log.d(TAG,"Company name :"+eventNoticeFromServer.getCompanyName());
					
					noticeDetailTitle.setText(eventNoticeFromServer.getSubject());
					noticeDetailContent.setText(eventNoticeFromServer.getContent());

//					noticeDetailRegisterDate.setText(eventNoticeFromServer.getRegisterDate());
//					if(eventNoticeFromServer.getRegisterDate().length()>0){
//						noticeDetailRegisterDateIs.setVisibility(View.VISIBLE);
//					}
					
					storeNameView.setText(eventNoticeFromServer.getCompanyName());
					regDateView.setText(eventNoticeFromServer.getRegisterDate());  
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.notice_detail_progressbar);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.notice_detail_progressbar);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(MainNoticeDetailActivity.this, R.string.error_message, Toast.LENGTH_SHORT).show();
				}
				
				switch (msg.what)
				{
					case GET_NOTICE_DETAIL : runOnUiThread(new RunnableGetNoticeDetail());
						break;
					default : 
						break;
				}

				
				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		Log.w(TAG,"onCreate");
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.main_notice_detail_activity);

		waitnumberStoreMRest = new WaitnumberStoreMRest();
		
		// 이미지, 타이틀 , 등록일 , 본문
		noticeDetailImageView = (ImageView)findViewById(R.id.notice_detail_image_view);
		noticeDetailTitle = (TextView)findViewById(R.id.notice_detail_title);
		noticeDetailContent = (TextView)findViewById(R.id.notice_detail_content);
		storeNameView = (TextView)findViewById(R.id.store_name_view);	
		regDateView = (TextView)findViewById(R.id.reg_date_view);	
		
		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothic);  
	    typefaceNanumGothicBold = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothicBold);
	    noticeDetailTitle.setTypeface(typefaceNanumGothic);
	    noticeDetailContent.setTypeface(typefaceNanumGothic);
	    storeNameView.setTypeface(typefaceNanumGothicBold);
	    regDateView.setTypeface(typefaceNanumGothic);
		
		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		// 상단 닫기 버튼
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
				
		// progress bar
		pb1 = (ProgressBar) findViewById(R.id.notice_detail_progressbar);		// 로딩(중앙)
		
		
		// prefs
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		
		getNoticeDetail_pre();
	}
	
	/**
	 * 이벤트 상세 정보 조회전에 이벤트 리스트로부터 전달해준 데이터를 받아서 저장하고, 상세 정보를 조회한다.
	 */
	public void getNoticeDetail_pre(){
		Intent rIntent = getIntent();
		idWaitingEvents = rIntent.getStringExtra("idWaitingEvents");			
		merchantId = rIntent.getStringExtra("merchantId");			
		companyName = rIntent.getStringExtra("companyName");		
		subject = rIntent.getStringExtra("subject");			
		content = rIntent.getStringExtra("content");			
		imageFileUrl = rIntent.getStringExtra("imageFileUrl");			
		registerDate = rIntent.getStringExtra("registerDate");			

//		Log.d(TAG,"imageFileUrl:"+imageFileUrl);	// 건짐
		eventNoticeFromIntent = new EventNotice(idWaitingEvents, merchantId, companyName, subject, content, imageFileUrl, registerDate);
		
		if(merchantId.length()>0){
			handler.sendEmptyMessage(GET_NOTICE_DETAIL);
		}else{
			showMSG();		// 에러시 핸들러 통한 토스트
			finish();
		}
	}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	
	/**
	 * 러너블. 이벤트 상세 정보를 가져온다.
	 */
	class RunnableGetNoticeDetail implements Runnable {
		public void run(){
			new backgroundThreadGetNoticeDetail().execute();
		}
	}
	/**
	 * backgroundThreadGetNoticeDetail
	 * 비동기 스레드  서버와 통신하여  이벤트 상세 정보를 가져온다.
	 * @author blue
	 *
	 */
	public class backgroundThreadGetNoticeDetail extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadGetNoticeDetail");
			
			// 파라미터 세팅
			EventNotice eventNotice = new EventNotice();
			eventNotice.setMerchantId(merchantId);
			eventNotice.setIdWaitingEvents(idWaitingEvents);
			// 서버 메소드 호출
			showPb();
			callResult = waitnumberStoreMRest.RestGetNoticeDetail(eventNotice);
			hidePb();
			// 결과 처리
			if(!(callResult.equals("F"))){
//				tempstr = waitnumberStoreMRest.getTempstr();
			}
			processNoticeData(callResult);	// 처리해서 화면에 보여준다. 중간에 실패한다면 리스트에서 받은 정보를 대신해서 보여준다.
			return null; 
		}
	}

	
	/**
	 * backgroundSetImage
	 * 비동기 이미지 받아서 세팅. 이후 showInfo 호출
	 * @author blue
	 *
	 */
	public class backgroundSetImage extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundSetImage");
			
			if(eventNoticeFromServer.getImageFileUrl()!=null && eventNoticeFromServer.getImageFileUrl().length()>0){
				if(eventNoticeFromServer.getImageFileUrl().contains("http")){		// url 포함한 경우
					try{
						img = LoadImage(eventNoticeFromServer.getImageFileUrl());
//						bm = LoadImage(tmp_profileThumbnailImageUrl);				 
					}catch(Exception e3){}
				}else{		// url 포함하지 않으면 붙여준다.
					try{
						img = LoadImage(eventImgDomain+eventNoticeFromServer.getImageFileUrl());				 
					}catch(Exception e3){
						Log.w(TAG, eventImgDomain+eventNoticeFromServer.getImageFileUrl()+" -- fail");
					}
				}
				eventNoticeFromServer.setImageFile(img);
			}
			
			showInfo();
			
			return null; 
		}
	}
	
////////////////////////////////////////////////////////////////////////////////
	
	// 공지 정보 가져온 것을 처리하여 화면에 보여준다.
	public void processNoticeData(String callResult){
		eventNoticeFromServer = new EventNotice();
		try {
			jsonObject = new JSONObject(callResult);
			
			// 날짜 형식 변환해서 저장하기 용도
			String tmp_registerDate = "";
			int dayOfRegisterDate = 0;	// 오전 오후 분간용
			String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
			String strAMPM = "";
			String tmp_registerDate2 = "";	// 형식 변환해서 저장용
			
			try{
				eventNoticeFromServer.setIdWaitingEvents(jsonObject.getString("idWaitingEvents"));				
			}catch(Exception e){
				eventNoticeFromServer.setIdWaitingEvents("");
			}
			try{
				eventNoticeFromServer.setMerchantId(jsonObject.getString("merchantId"));				
			}catch(Exception e){
				eventNoticeFromServer.setMerchantId("");
			}
			eventNoticeFromServer.setCompanyName(eventNoticeFromIntent.getCompanyName());
//			try{
//				eventNoticeFromServer.setCompanyName(jsonObject.getString("companyName"));					
//			}catch(Exception e){
//				eventNoticeFromServer.setCompanyName("");
//			}
			try{
				eventNoticeFromServer.setSubject(jsonObject.getString("subject"));				
			}catch(Exception e){
				eventNoticeFromServer.setSubject("");
			}
			try{
				eventNoticeFromServer.setContent(jsonObject.getString("content"));				
			}catch(Exception e){
				eventNoticeFromServer.setContent("");
			}
			try{
				eventNoticeFromServer.setImageFileUrl(jsonObject.getString("imageFileUrl"));				
			}catch(Exception e){
				eventNoticeFromServer.setImageFileUrl("");
			}
			try{
				tmp_registerDate = jsonObject.getString("registerDate");		
				// 길면 자르기
				if(tmp_registerDate!=null &&(tmp_registerDate.length()>19)){
					tmp_registerDate = tmp_registerDate.substring(0, 19);		// 2013-05-15 15:21:25  -> 초까지 나옴
				}
				// 오전 오후 분간하기
				dayOfRegisterDate = Integer.parseInt(tmp_registerDate.substring(11, 13));	// dayOfRegisterDate
				if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
					dayOfRegisterDate = dayOfRegisterDate - 12;
					strAMPM = getString(R.string.pm_of_day)+"";
				}else{				// 12시 이전 = 오전
					strAMPM = getString(R.string.am_of_day)+"";
				}
				// 두자리로 맞추기.
				dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
				if(dayOfRegisterDate<10){		
					dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
				}
//				// 원하는 날짜 형식에 맞춰서 데이터 넣기
//				tmp_registerDate2 = tmp_registerDate.substring(0, 4)+getString(R.string.year) +tmp_registerDate.substring(5, 7) + getString(R.string.month) + tmp_registerDate.substring(8, 10) + getString(R.string.day) + " " + strAMPM + " " + dayOfRegisterDateStr + tmp_registerDate.substring(13);
				// 원하는 날짜 형식에 맞춰서 데이터 넣기
				tmp_registerDate2 = 
					tmp_registerDate.substring(0, 4)+getString(R.string.year) 
					+tmp_registerDate.substring(5, 7) + getString(R.string.month) 
					+tmp_registerDate.substring(8, 10) + getString(R.string.day) 
					+ " " + strAMPM + " " 
					+dayOfRegisterDateStr + getString(R.string.hour) 
					+tmp_registerDate.substring(14, 16) + getString(R.string.minute) 
					+tmp_registerDate.substring(17, 19) + getString(R.string.seconds);
				tmp_registerDate = tmp_registerDate2;	
				
				eventNoticeFromServer.setRegisterDate(tmp_registerDate2);	
			}catch(Exception e){
				eventNoticeFromServer.setRegisterDate("");
			}
			if(eventNoticeFromServer.getMerchantId().length()<1){
				eventNoticeFromServer = eventNoticeFromIntent;
			}
		} catch (Exception e) {
			e.printStackTrace();
			eventNoticeFromServer = eventNoticeFromIntent;
		} 

		new backgroundSetImage().execute();		// 비동기로 이미지 작업 후 showInfo(); 호출
		// showInfo();
	}
	
	
//////////////////////////////  이미지 받아오기 	/////////////////////////////////////////////////////////////
	
	// 가맹점 이미지 URL 에서 이미지 받아와서 도메인에 저장하는 부분.
	/**
	 * LoadImage
	 *  가맹점 이미지 URL 에서 이미지 받아온 스트림을 비트맵으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return bm
	 */
	private Bitmap LoadImage( String $imagePath ) {
		InputStream inputStream = OpenHttpConnection( $imagePath ) ;
		Bitmap bm = BitmapFactory.decodeStream( inputStream ) ;
		return bm;
	}
	/**
	 * OpenHttpConnection
	 *  가맹점 이미지 URL 에서 이미지 받아와서 스트림으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return stream
	 */
	private InputStream OpenHttpConnection(String $imagePath) {
		InputStream stream = null ;
		try {
			URL url = new URL( $imagePath ) ;
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection() ;
			urlConnection.setRequestMethod( "GET" ) ;
			urlConnection.connect();
			if( urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK ) {
				stream = urlConnection.getInputStream() ;
			}
		} catch (MalformedURLException e) {
			Log.w(TAG,"MalformedURLException");
		} catch (IOException e) {
			Log.w(TAG,"IOException");
		}
		return stream ;
	}
	
//////////////////////////////  Util 	/////////////////////////////////////////////////////////////
	
	/**
	 * showInfo
	 *  받아온 정보를 화면에 보여준다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		MainNoticeDetailActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("showYN", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	
	/**
	 * showMSG
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showMSG(){			// 화면에 error 토스트 띄움..
		MainNoticeDetailActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showErrToast", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	
	
	
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		MainNoticeDetailActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		MainNoticeDetailActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 2);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	
}
